package com.CodeBlock代码块;

public class CodeBlock细节 {
    /**
     * 1.static代码块也叫静态代码块，静态代码块  “在类加载”   的时候执行，只执行一次
     * 2.不加static修饰的代码块，是在对象创建的时候执行，每次创建对象都会执行一次，如果只是使用静态成员，则普通代码块不执行；
     *
     * 3.类什么时候会被加载：  （只执行一次）
     *   3.1创建对象实例时（new）
     *   3.2使用类的静态成员（静态属性、静态方法）
     *   3.3创建子类对象实例时，父类也会被加载，而且父类先被加载，子类后被加载。
     */

    public static void main(String[] args) {
        // 3.1创建对象实例时（new）类被加载
        CC c1 = new CC();  // CC static 代码块
        System.out.println("=====================\n\n");

        //3.3创建子类对象实例时，父类也会被加载，而且父类先被加载，子类后被加载。
        BB b1 = new BB();//创建BB对象，会先加载其父类AA
        //AA static 代码块  ,父类先被加载，子类后被加载
        //BB static 代码块
        System.out.println("=====================\n\n");

        //3.2使用类的静态成员（静态属性、静态方法）
        DD d1 = new DD();
        System.out.println(d1.n1);
        //使用类的静态属性会加载CC类，调用静态代码块，后输出n1
        //如果DD继承了别的类，则先加载父类，再加载子类
        DD d2 = new DD();//又创建一个DD对象则不会再加载static代码块，因为DD类已经加载过了
        System.out.println("=====================\n\n");

    }
}

class AA{
    static{
        System.out.println("AA static 代码块");
    }
}
class BB extends AA{
    static{
        System.out.println("BB static 代码块");
    }
}

class CC{
    static{
        System.out.println("CC static 代码块");
    }

}


class DD{
    public static int n1 = 100;
    static{
        System.out.println("DD static 代码块");
    }
}
